package com.java.basis.collection;

import java.util.TreeSet;

/**
 * 如果是引用数据类型呢,比如自定义对象,又该如何排序呢?
 * 直接进行排序，结果会报错
 * 原因分析：
 * 由于不知道该按照哪一种排序方式排序，所以会报错。
 * 解决方法：
 * 1.自然排序
 * 2.比较器排序
 *
 * @author wangning
 * @create 2021-04-08 16:10
 */
class Student01 implements Comparable<Student01> {
	private String name;

	private Integer age;

	public Student01() {
		super();
		// TODO Auto-generated constructor stub
	}

	public Student01(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public Integer getAge() {
		return age;
	}

	public void setName(String name) {
		this.name = name;
	}

	public void setAge(Integer age) {
		this.age = age;
	}

	@Override
	public int compareTo(Student01 s) {
		//return -1; //-1表示放在红黑树的左边,即逆序输出
		//return 1;  //1表示放在红黑树的右边，即顺序输出
		//return o;  //表示元素相同，仅存放第一个元素
		//主要条件 姓名的长度,如果姓名长度小的就放在左子树，否则放在右子树
		int num=this.name.length()-s.getName().length();
		//姓名的长度相同，不代表内容相同,如果按字典顺序此 String 对象位于参数字符串之前，则比较结果为一个负整数。
		//如果按字典顺序此 String 对象位于参数字符串之后，则比较结果为一个正整数。
		//如果这两个字符串相等，则结果为 0
		int num1=num==0?this.name.compareTo(s.getName()):num;
		//姓名的长度和内容相同，不代表年龄相同，所以还要判断年龄
		int num2=num1==0?this.age-s.getAge():num1;
		return num2;
	}
}
public class TestTreeSetRefeDataType01 {
	//1.自然排序
	//自然排序要进行一下操作：
	//1.Student类中实现 Comparable接口
	//2.重写Comparable接口中的Compareto方法
	public static void main(String[] args) {
		TreeSet<Student01> ts=new TreeSet<>();
		//创建元素对象
		Student01 s1=new Student01("zhangsan",20);
		Student01 s2=new Student01("lisi",22);
		Student01 s3=new Student01("wangwu",24);
		Student01 s4=new Student01("chenliu",26);
		Student01 s5=new Student01("zhangsan",22);
		Student01 s6=new Student01("qianqi",24);

		//将元素对象添加到集合对象中
		ts.add(s1);
		ts.add(s2);
		ts.add(s3);
		ts.add(s4);
		ts.add(s5);
		ts.add(s6);

		//遍历
		for(Student01 s:ts){
			System.out.println(s.getName()+"-----------"+s.getAge());
		}

	}
}
